home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / gadgettest2 / gadget2.asm next >
Encoding:
Assembly Source File  |  1980-01-04  |  13.8 KB  |  388 lines

  1. ;*
  2. ;
  3. ; ### Gadgets 2 by JM v1.0 ###
  4. ;
  5. ; - Created 911014 by JM -
  6. ;
  7. ; Edited:
  8. ;
  9. ; - 911017 by JM -> v1.0    - lopullinen kommentoitu versio.
  10. ;
  11. ;
  12.  
  13.         include "exec/types.i"
  14.         include "exec/nodes.i"
  15.         include "exec/lists.i"
  16.         include "exec/memory.i"
  17.         include    "graphics/gfx.i"
  18.         include    "graphics/gfxbase.i"
  19.         include    "graphics/text.i"
  20.         include    "intuition/intuition.i"
  21.         include    "intuition/screens.i"
  22.  
  23. lib        macro            ; käyttö: lib kirjasto,rutiini
  24.         xref    _LVO\2        ; määrittelee offsetin
  25.         move.l    \1base(a4),a6    ; ottaa kirjaston perusosoitteen
  26.         jsr    _LVO\2(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  27.         endm
  28.  
  29. flib        macro            ; käyttö: flib kirjasto,rutiini
  30.         xref    _LVO\2        ; määrittelee offsetin
  31.         jsr    _LVO\2(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  32.         endm
  33.  
  34. exec        macro            ; käyttö: exec rutiini
  35.         xref    _LVO\1        ; määrittelee offsetin
  36.         move.l    $4,a6        ; ottaa execin perusosoitteen
  37.         jsr    _LVO\1(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  38.         endm
  39.  
  40. fexec        macro            ; käyttö: exec rutiini
  41.         xref    _LVO\1        ; määrittelee offsetin
  42.         jsr    _LVO\1(a6)    ; kutsuu rutiinia _LVOxxx(a6)
  43.         endm
  44.  
  45. WFLAGS        set    SIMPLE_REFRESH!WINDOWDEPTH
  46. WFLAGS        set    WFLAGS!WINDOWDRAG!WINDOWSIZING!WINDOWCLOSE
  47.  
  48. IDCMPFLAGS    set    CLOSEWINDOW!GADGETUP!MOUSEMOVE!REFRESHWINDOW
  49.  
  50. intuibase    equ    -4    ; tila Intuition-kirjaston osoittimelle
  51. gfxbase        equ    -8    ; tila Graphics-kirjaston osoittimelle
  52. window        equ    -12    ; tila Window-osoittimelle
  53. rp        equ    -16    ; tila RastPort-osoittimelle
  54. quit        equ    -20    ; lippu: pitää poistua
  55.  
  56. ;----------------------------------------------------------------------------
  57. ;
  58. ; Pääohjelma.  Alussa nollataan pinomuuttujat ja avataan tarvittavat
  59. ; kirjastot (Intuition ja Graphics).
  60. ;
  61. main    link    a4,#-24            ; varataan muuttujatilaa
  62.     clr.l    intuibase(a4)        ; nollataan muuttujat
  63.     clr.l    gfxbase(a4)
  64.     clr.l    window(a4)
  65.     clr.w    quit(a4)        ; nolla: ei poistuta
  66.  
  67.     lea    gfx(pc),a1        ; grafiikkakirjaston nimi
  68.     moveq    #0,d0            ; kirjastoversio (mikä tahansa)
  69.     exec    OpenLibrary        ; kutsutaan OpenLibrary()ä
  70.     move.l    d0,gfxbase(a4)        ; talletetaan gfx:n perusosoite
  71.     beq    cleanup            ; jos kirjastoa ei ole, pois!
  72.  
  73.     lea    intui(pc),a1        ; Intuition-kirjaston nimi
  74.     moveq    #0,d0            ; kirjastoversio (mikä tahansa)
  75.     fexec    OpenLibrary        ; kutsutaan OpenLibrary()ä
  76.     move.l    d0,intuibase(a4)    ; talletetaan I:n perusosoite
  77.     beq    cleanup            ; jos kirjastoa ei ole, pois!
  78.  
  79.     move.l    #$31303000,buffer    ; asetetaan puskuriin "100",0
  80.  
  81. ; Avataan ikkuna.  Intuition liittää gadgetit automaattisesti ikkunaan,
  82. ; koska niiden osoitin on asetettu NewWindow-struktuuriin.
  83.  
  84.     lea    Newwindow,a0        ; NewWindow-struktuurin osoite
  85.     lib    intui,OpenWindow    ; kutsutaan OpenWindow()ia
  86.     move.l    d0,window(a4)        ; talletetaan Window:n osoite
  87.     beq    cleanup            ; jos ei auennut, pois!
  88.     move.l    d0,a0
  89.     move.l    wd_RPort(a0),rp(a4)    ; otetaan RastPortin osoite
  90.     move.l    wd_UserPort(a0),a5    ; ikkunan viestiportti a5:een
  91.  
  92. ;----------------------------------------------------------------------------
  93. ;
  94. ; Silmukka, jossa odotetaan IDCMP-viestejä ja käsitellään niiden komennot.
  95. ; Odottaminen tapahtuu Execin Wait-rutiinilla.
  96. ; Kun ohjelma saa CLOSEWINDOW-viestin, asetetaan lippu merkiksi siitä, että
  97. ; ohjelman pitäisi poistua.  Sitten luetaan muut mahdolliset IDCMP-viestit,
  98. ; minkä jälkeen ohjelma päättyy.
  99. ; Kun käyttäjä vapauttaa jomman kumman gadgetin, ohjelma päivittää näytöllä
  100. ; olevan arvon.  Liukusäätimen käytön aikana ohjelma saa MOUSEMOVE-viestejä,
  101. ; joista näyttö myös päivitetään.
  102. ; Ikkunan virkistyspyyntö (REFRESHWINDOW) aiheuttaa säätöarvon tulostuksen,
  103. ; gadgettien päivittämisestä huolehtii Intuition itse.
  104. ;
  105.     bsr    showres            ; tulostetaan alkup. arvo ikkunaan
  106.  
  107. loop    tst.w    quit(a4)        ; pitääkö poistua?
  108.     bne    cleanup            ; joop -> voe tokkiisa
  109.  
  110. w_idcmp    moveq    #0,d0            ; bittimaski = 0
  111.     move.b    MP_SIGBIT(a5),d1    ; signaalibitin numero
  112.     bset    d1,d0            ; muunnetaan bittimaskiksi
  113.     exec    Wait            ; odotetaan IDCMP-viestiä
  114.  
  115. nextmsg    move.l    a5,a0            ; viestiportti
  116.     exec    GetMsg            ; otetaan saapunut viesti
  117.     tst.l    d0
  118.     beq.s    loop            ; häh? ei viestiä? odotetaan lisää!
  119.     move.l    d0,a1            ; saadun viestin osoite a1:een
  120.     move.l    im_Class(a1),d2        ; viestin tyyppi d2:een
  121.     move.w    im_Code(a1),d3        ; koodi (esim. näppäimen numero)
  122.     fexec    ReplyMsg        ; vastataan viestiin
  123.  
  124.     cmp.l    #CLOSEWINDOW,d2        ; painettiinko sulkunappulaa?
  125.     bne.s    10$            ; ei -> hyppää
  126.     move.w    #1,quit(a4)        ; kyllä: asetetaan lippu
  127.     bra.s    nextmsg            ; luetaan loput viestit
  128.  
  129. 10$    cmp.l    #REFRESHWINDOW,d2    ; ikkunan päivityspyyntö?
  130.     bne.s    20$            ; ei -> täytyy olla GADGET tai MOUSE
  131.     move.l    window(a4),a0
  132.     lib    intui,BeginRefresh    ; aloitetaan päivittäminen
  133.     bsr    showres            ; päivitetään (showres ei sotke a6:a)
  134.     move.l    window(a4),a0
  135.     moveq    #-1,d0            ; lippu: virkistys suoritettu
  136.     flib    intui,EndRefresh    ; aloitetaan päivittäminen
  137.     bra.s    nextmsg
  138.  
  139. ;----------------------------------------------------------------------------
  140. ; Jos tullaan tänne, viesti ei ollut CLOSEWINDOW eikä REFRESHWINDOW.  Siispä
  141. ; sen täytyy olla joko GADGETUP tai MOUSEMOVE, koska muita ei Intuitionilta
  142. ; ole pyydetty.  Molemmista viesteistä päivitetään ikkunassa näkyvä lukuarvo,
  143. ; koska MOUSEMOVE tarkoittaa liukusäätimen säätämistä ja GADGETUP sitä, että
  144. ; jompi kumpi gadgetti on vapautettu ja sen arvo saattaa siten olla muuttunut.
  145. ;
  146. 20$    bsr    showres            ; päivitetään arvo
  147.     bra.s    nextmsg
  148.  
  149. ;----------------------------------------------------------------------------
  150. ;
  151. ; cleanup sulkee kaiken, mikä oli avoinna.
  152. ;
  153. cleanup    move.l    window(a4),d0        ; onko ikkuna auki?
  154.     beq.s    101$            ; ei -> hypätään
  155.     move.l    d0,a0
  156.     lib    intui,CloseWindow    ; suljetaan ikkuna
  157.  
  158. 101$    move.l    gfxbase(a4),d0        ; graphics auki?
  159.     beq.s    201$            ; ei -> loikataan
  160.     move.l    d0,a1
  161.     exec    CloseLibrary        ; suljetaan graphics-kirjasto
  162.  
  163. 201$    move.l    intuibase(a4),d0    ; intuition auki?
  164.     beq.s    202$            ; ei -> harpataan
  165.     move.l    d0,a1
  166.     exec    CloseLibrary        ; suljetaan intuition
  167.  
  168. 202$    unlk    a4            ; vapautetaan pinoalue
  169.     moveq    #0,d0            ; ei virhettä
  170.     rts                ; poistutaan
  171.  
  172. ;----------------------------------------------------------------------------
  173. ;
  174. ; Päivitysrutiini, joka tulostaa ikkunaan proportional gadgetin säätöä
  175. ; vastaavan luvun.  Luku saadaan kertomalla proportional gadgetin arvo
  176. ; long int gadgettiin asetetulla luvulla ja jakamalla tulos 65535:llä.
  177. ;
  178. showres    lea    LongIntGadget,a0    ; long int -gadgetti
  179.     move.l    gg_SpecialInfo(a0),a2    ; StringInfo-osoitin a1:een
  180.     move.l    si_LongInt(a2),d1    ; lukuarvo gadgetista
  181.     bpl.s    1$            ; positiivinen -> hyppää
  182.     neg.l    d1            ; muutetaan negatiivinen positiiviseksi
  183. 1$    lea    PropGadget,a0
  184.     move.l    gg_SpecialInfo(a0),a1    ; PropInfo-osoitin a1:een
  185.     move.w    pi_VertPot(a1),d2    ; säätimen asento
  186.  
  187.     move.l    d1,d0
  188.     mulu.w    d2,d0            ; kerrotaan alemmat 16 bittiä
  189.     swap    d1
  190.     mulu.w    d2,d1            ; kerrotaan ylemmät 16 bittiä
  191.  
  192.     add.l    #32767,d0        ; lisätään pyöristys (puolet jakajasta)
  193.     swap    d1            ; d1[31-16]=[31-16], d1[15-0]=[47-32]
  194.     move.l    d1,d2
  195.     clr.w    d2            ; nollataan tuloksen bitit [47-32]
  196.     add.l    d2,d0            ; ynnätään eri kertolaskujen tulokset
  197.     moveq    #0,d2
  198.     addx.w    d2,d1            ; lisätään ylimpään wordiin muistinumero
  199.  
  200.     move.l    #65535,d2        ; jakaja
  201.     bsr    divu48            ; jaetaan tulo 65535:llä
  202.     tst.l    si_LongInt(a2)        ; oliko arvo alunperin negatiivinen?
  203.     bpl.s    2$            ; ei -> hyppää
  204.     neg.l    d0            ; oli -> muuta tulos negatiiviseksi
  205. 2$    lea    format(pc),a0        ; muotoilumerkkijono (format string)
  206.     bsr    display            ; tulostetaan luku ikkunaan
  207.     rts
  208.  
  209. ;----------------------------------------------------------------------------
  210. ;
  211. ; Tämä rutiini jakaa d0:ssa ja d1:ssä olevan 48-bittisen luvun d2:ssa oleval-
  212. ; la 32-bittisellä luvulla.  Jaettavan alimmat 32 bittiä ovat d0:ssa ja ylim-
  213. ; mät 16 bittiä d1:n 16 alimmassa bitissä.  Rutiini ei aina toimi oikein, jos
  214. ; jakajan ylin bitti on ykkönen (jakajan on oltava 2147483647 tai alle).
  215. ;
  216. divu48    movem.l    d2-d5,-(sp)    ; rekisterit d2, d3, d4 ja d5 pinoon
  217.     moveq.l    #0,d3        ; nollataan apuakku
  218.     moveq.l    #47,d5        ; jaettavan bittien määrä -1
  219. 1$    roxl.l    #1,d0        ; jaettavan alimmat 32 bittiä
  220.     roxl.w    #1,d1        ; jaettavan eniten merkitsevät 16 bittiä
  221.     roxl.l    #1,d3        ; väliaikainen akku
  222.     cmp.l    d2,d3        ; verrataan jakajaan
  223.     bcs.s    2$        ; ei voi vähentää -> hyppää
  224.     sub.l    d2,d3        ; vähennetään
  225.     ori    #16,ccr        ; asetetaan X-lippu (tulokseen ykkösbitti)
  226. 2$    roxl.l    #1,d4        ; bitti lisää tulokseen
  227.     dbf    d5,1$        ; silmukka toistetaan 48 kertaa
  228.     move.l    d4,d0        ; osamäärä d0:aan
  229.     move.l    d3,d1        ; jakojäännös d1:een
  230.     movem.l    (sp)+,d2-d5    ; rekisterit pinosta
  231.     rts
  232.  
  233. ;----------------------------------------------------------------------------
  234. ;
  235. ; Tämä rutiini tulostaa datarekistereissä annetut parametrit a0:ssa annetun
  236. ; muotoilumerkkijonon ohjeiden mukaan Text-rutiinilla.  Tässä ohjelmassa
  237. ; tarvitaan tulostaa vain d0:n arvo.
  238. ; Koska Execin RawDoFmt ei palauta lopullisen merkkijonon pituutta, se jou-
  239. ; dutaan laskemaan käsin silmukassa.
  240. ;
  241. display    movem.l    d0-d7/a0-a3/a6,-(sp)    ; tulostett. param. ja a0-a3/a6 pinoon
  242.     move.l    sp,a1            ; pino-osoitin a1:een (parametriosoitin)
  243.     lea    putchar(pc),a2        ; rutiini, joka laittaa merkit puskuriin
  244.     lea    output_buffer,a3    ; tulostuspuskuri
  245.     exec    RawDoFmt        ; muotoillaan tulostus
  246.     move.l    a3,a2            ; puskurin osoite a2:een
  247. 1$    tst.b    (a2)+            ; mitataan merkkijonon pituus
  248.     bne.s    1$            ; silmukka, kunnes loppunolla
  249.     subq.w    #1,a2            ; vähennetään loppunollan viemä tila
  250.     sub.l    a3,a2            ; vähennetään puskurin alkuosoite
  251.  
  252.     move.l    rp(a4),a1        ; ikkunan RastPort
  253.     moveq    #1,d0            ; piirtokynän numero
  254.     lib    gfx,SetAPen        ; asetetaan tekstin väri
  255.     move.l    rp(a4),a1        ; ikkunan RastPort
  256.     moveq    #9,d0            ; piirtokynän x-paikka
  257.     moveq    #45,d1            ; piirtokynän y-paikka
  258.     flib    gfx,Move        ; siirretään piirtokynä
  259.     move.l    a3,a0            ; tekstin alkuosoite (puskuri)
  260.     move.l    rp(a4),a1        ; ikkunan RastPort
  261.     move.l    a2,d0            ; tulostettavan tekstin pituus
  262.     flib    gfx,Text        ; tulostetaan teksti
  263.     movem.l    (sp)+,d0-d7/a0-a3/a6    ; otetaan rekisterit pinosta
  264.     rts
  265. putchar    move.b    d0,(a3)+        ; tämä rutiini laittaa merkit puskuriin
  266.     rts
  267.  
  268. ;----------------------------------------------------------------------------
  269. ;
  270. gfx    dc.b    "graphics.library",0    ; kirjastojen nimet
  271. intui    dc.b    "intuition.library",0
  272. format    dc.b    'Arvo=%10.10ld',0    ; tulostuksen muotoilumerkkijono
  273.     ds.w    0            ; varmistetaan osoite parilliseksi
  274.  
  275. ;----------------------------------------------------------------------------
  276. ;
  277. ; Muuttuvat struktuurit, jotka on sijoitettu erilliseen data-tyyppiseen
  278. ; lohkoon, jolloin itse ohjelman koodi pysyy muuttumattomana suositusten
  279. ; mukaisesti.
  280.  
  281.         section    struct,DATA
  282. Newwindow    dc.w    10,100        ; ikkunan koordinaatit (x,y)
  283.         dc.w    250,60        ; ikkunan koko (x,y)
  284.         dc.b    0,1        ; kynien värit
  285.         dc.l    IDCMPFLAGS    ; vahdi sulkunappulaa yms
  286.         dc.l    WFLAGS        ; liput
  287.         dc.l    LongIntGadget    ; ensimmäinen gadget
  288.         dc.l    0        ; ei omaa checkmarkkia
  289.         dc.l    WTitle        ; ikkunan otsikkopalkin teksti
  290.         dc.l    0        ; näytön osoitin, ei tarvita tässä
  291.         dc.l    0        ; ei BitMap-osoitinta
  292.         dc.w    250,60        ; ikkunan minimikoko
  293.         dc.w    1000,1000    ; ikkunan maksimikoko
  294.         dc.w    WBENCHSCREEN    ; näytön tyyppi = WORKBENCH
  295.  
  296. ; gadgetit ja niihin liittyvät apustruktuurit
  297. LongIntGadget    dc.l    PropGadget    ; osoitin seuraavaan gadgettiin
  298.         dc.w    50,20        ; x- ja y-paikka
  299.         dc.w    160,10        ; x- ja y-koko
  300.         dc.w    GADGHCOMP    ; liput
  301.         dc.w    RELVERIFY|LONGINT; viesti vasta vapautettaessa
  302.         dc.w    STRGADGET    ; tyyppi = string / long int
  303.         dc.l    LongIntBorder    ; kehys gadgetin ympärille ->
  304.         dc.l    0        ; aktivoidessa ei uutta kuviota
  305.         dc.l    LongIntText    ; gadgetin teksti
  306.         dc.l    0        ; mutual exclude, ei käytössä
  307.         dc.l    LongIntSInfo    ; special info -> StringInfo
  308.         dc.w    0        ; gadget ID (käyttäjän käytettävissä)
  309.         dc.l    0        ; userdata (käyttäjän käytettävissä)
  310.  
  311. LongIntSInfo    dc.l    buffer        ; puskuri gadgetin tekstille
  312.         dc.l    undo_buffer    ; undo-puskuri
  313.         dc.w    0        ; paikka, jossa ollaan editoimassa
  314.         dc.w    33        ; merkkipuskurin koko - 1
  315.         dc.w    0        ; ensimmäinen näytöllä näkyvä merkki
  316.         dc.w    0,0,0,0,0    ; Intuitionin sisäisiä muuttujia
  317.         dc.l    0        ; ei käytössä 1.3:ssa
  318.         dc.l    100        ; longint-arvo, jota Intuition päivittää
  319.         dc.l    0        ; vaihtoehtoinen näppäinkartta
  320.  
  321. ; struktuuri, joka määrittelee gadgetin ympärille piirrettävän kehyksen
  322. LongIntBorder    dc.w    -2,-2        ; suhteellinen paikka
  323.         dc.b    1,2        ; piirtovärit
  324.         dc.b    RP_JAM1        ; piirtomoodi
  325.         dc.b    5        ; koordinaattiparien määrä
  326.         dc.l    LongIntVectors    ; koordinaattiparitaulukko ->
  327.         dc.l    0        ; ei useampia Border-struktuureja
  328.  
  329. LongIntVectors    dc.w    0,0,163,0,163,11,0,11,0,0 ; viivojen koordinaattiparit
  330.  
  331. LongIntText    dc.b    1,2        ; piirtovärit
  332.         dc.b    RP_JAM1        ; piirtomoodi
  333.         dc.b    0        ; (ei käytössä)
  334.         dc.w    -40,0        ; suhteellinen paikka
  335.         dc.l    0        ; fontti = oletusfontti
  336.         dc.l    LongInt_Text    ; teksti
  337.         dc.l    0        ; ei lisätekstiä
  338.  
  339. PropGadget    dc.l    0        ; ei enempää gadgetteja
  340.         dc.w    -33,11        ; x- ja y-paikka
  341.         dc.w    16,-14        ; x- ja y-koko
  342.         dc.w    GADGHCOMP!GRELRIGHT!GRELHEIGHT; liput
  343.         dc.w    RELVERIFY!FOLLOWMOUSE; viesti vasta vapautettaessa
  344.         dc.w    PROPGADGET    ; tyyppi = proportional
  345.         dc.l    KnobImage    ; tilaa nappulan kuvalle (Image-strukt.)
  346.         dc.l    0        ; aktivoidessa ei uutta kuviota
  347.         dc.l    0        ; ei tekstiä
  348.         dc.l    0        ; mutual exclude, ei käytössä
  349.         dc.l    PropPInfo    ; special info -> PropInfo
  350.         dc.w    0        ; gadget ID (käyttäjän käytettävissä)
  351.         dc.l    0        ; userdata (käyttäjän käytettävissä)
  352.  
  353. PropPInfo    dc.w    AUTOKNOB!FREEVERT; liput: autom. nuppi, pystys. liike
  354.         dc.w    0        ; vaakasuunnan säätöarvo
  355.         dc.w    0        ; pystysuunnan säätöarvo
  356.         dc.w    0        ; vaakasuunnan 'nupin koko'
  357.         dc.w    4095        ; pystysuunnan 'nupin koko'
  358.         dc.w    0,0,0,0,0,0    ; Intuitionin sisäisiä muuttujia
  359.  
  360. ; Image-struktuuri, johon Intuition määrittelee säätönappulan koon, paikan
  361. ; ja kuvion (automaattisesti, koska käytettiin AUTOKNOB-toimintaa):
  362. KnobImage    dc.w    0,0,0,0,0    ; paikka, koko, bittitasojen määrä
  363.         dc.l    0        ; osoitin itse kuvioon
  364.         dc.b    0,0        ; PlanePick, PlaneOnOff
  365.         dc.l    0        ; osoitin seuraavaan Image-struktuuriin
  366.  
  367. ;----------------------------------------------------------------------------
  368. ;
  369. ; Tekstit:
  370. ;
  371. WTitle        dc.b    'SimpleRefresh-ikkuna',0
  372. LongInt_Text    dc.b    'Max:',0
  373.         ds.w    0
  374.  
  375. ;----------------------------------------------------------------------------
  376. ;
  377. ; Tarvittavat merkkijonopuskurit on sijoitettu omaan BSS-hunkkiinsa, jolloin
  378. ; ne eivät vie tilaa ohjelman käännetystä versiosta, mutta niille varataan
  379. ; automaattisesti tilaa ohjelmaa ladattaessa.
  380. ;
  381.         section    puskurit,bss
  382. buffer        ds.b    34        ; LongInt-gadgetin tekstipuskuri
  383. undo_buffer    ds.b    34        ; vähintään yhtä iso kuin edellinen!!
  384. output_buffer    ds.b    100        ; tulostuspuskuri
  385.  
  386.         end
  387.  
  388.